package gui;

import gui.ComponentSwitcher.ComponentChoice;

import java.awt.Color;
import java.io.IOException;
import java.util.*;

import javax.swing.*;

import domain.IRCController;

/**
 * Klasse GUIController.
 * Is de Controller van alles wat er in de GUI gebeurt (Facade-pattern).
 * Alle communicatie naar de GUI toe loopt via de GUIController.
 * Is ook een observer (Observerpattern).
 * @author Maarten Minnebo, David Covemaeker, Tim Van Thuyne, Toon Kin
 */
public class GUIController implements Observer
{	
	private IRCController ircController;
	private MainFrame mainFrame;
	private String startChannel;
	private IRCScherm tabs;
	private Color bgc;
	private Color bgcl;
	
	/**
	 * Is de constructor van de klasse.
	 * Zal de IRCController aanmaken en het MainFrame.
	 * Zet ook het MainFrame in de LaadScherm - modus
	 */
	public GUIController() 
	{
		initIrcController();
		mainFrame = new MainFrame(this);

		bgc = new Color(239, 228, 176);
		bgcl = new Color(250, 240, 210);
		
		UIManager.put("TabbedPane.selected", bgc);
		UIManager.put("TabbedPane.borderHightlightColor", bgc);
		UIManager.put("TabbedPane.contentAreaColor", bgc);
		UIManager.put("TabbedPane.background", bgcl);
		UIManager.put("TabbedPane.focus", bgc);
		UIManager.put("TabbedPane.darkShadow", Color.WHITE);
		
		mainFrame.switchToComponent(this, ComponentChoice.WelcomeScherm);
	}
	/**
	 * Functie wordt opgeroepen door GUIController.
	 * Zal de IRCController aanmaken.
	 * Zal de GUIController (this) inschrijven als observer bij de IRCController
	 */
	public void initIrcController()
	{
		ircController = new IRCController(this);
		ircController.addObserver(this);
	}

	/**
	 * Overridefunctie van de update()-functie van de observer
	 * Zal aangeroepen worden wanneer door het Subject wanneer die gewijzigd is.
	 * Deze functie zal doen een extra tab openen op het scherm.
	 * Wanneer er nog geen tabs voor handen zijn zal hij eerst het mainFrame in modus 'IRCScherm' zetten.
	 */
	@Override
	public void update(Observable o, Object arg)
	{
		if(tabs == null)
		{
			mainFrame.switchToComponent(this, ComponentChoice.IRCScherm);
			tabs = (IRCScherm) mainFrame.getContentPane();
			
			tabs.addNewChannelTab(startChannel);
		}
		else
		{
			tabs.addTab((String) arg, new Tab(ircController, (String) arg));
		}
	}

	/**
	 * Functie die de gegevens uit de GUI zal doorsturen naar de IRCController om connectie te maken met de server.
	 * @param server URL van de gewenste IRC-server
	 * @param port Poortnummer van de gewenste poort om te communiceren
	 * @param channel Naam van het kanaal (String) waarop men wil intekenen
	 * @param nick Nickname (String) van de gebuiker
	 * @return boolean false wanneer connectie mislukt, boolean true wanneer geslaagd.
	 */
	protected boolean submitData(String server, int port, String channel, String nick)
	{
		boolean connected = false;
		
		try
		{
			connected = ircController.connect(server, nick, port);
			
			startChannel = channel;
			
			return connected;
		}
		catch (IOException e) 
		{
			JOptionPane.showMessageDialog(mainFrame.getContentPane(), "Verbinding met IRC server is mislukt.", "Netwerkfout", JOptionPane.ERROR_MESSAGE);
		}
		
		return connected;
	}
	
	/**
	 * Functie die de IRCController zal aanroepen om de verbinding te verbreken
	 */
	protected void disconnect()
	{
		try
		{	
			ircController.disconnect();
		}
		catch(IOException ioe)
		{
			JOptionPane.showMessageDialog(mainFrame.getContentPane(), "Er was een fout bij het verbreken van de verbinding.", "Verbindingsfout", JOptionPane.ERROR_MESSAGE);
		}
	}
	
	/**
	 * Functie de IRCController teruggeeft ('getter')
	 * @return
	 */
	protected IRCController getIrcController()
	{
		return ircController;
	}
	
	/**
	 * Functie die de MainFrame teruggeeft. ('getter')
	 * @return
	 */
	public MainFrame getMainFrame()
	{
		return mainFrame;
	}
}
